home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / ww_tv.exe / TEDITOR1.CPP < prev    next >
C/C++ Source or Header  |  1992-08-24  |  21KB  |  698 lines

  1. /*------------------------------------------------------------*/
  2. /* filename - teditor1.cpp                                    */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*            TEditor member functions                        */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision -  Version 1.0                             */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Copyright (c) 1991 by Borland International             */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*------------------------------------------------------------*/
  17.  
  18. //  Primatech Modification History:
  19. //
  20. //      11-07-91 JLS  Changed constructor to initialize new data fields
  21. //      11-26-91 JLS  Added break after evCommand case in handleEvent()
  22. //      12-02-91 JLS  Changed cmDelChar processing so that a soft return is
  23. //                      not deleted, just skipped.
  24. //      02-18-92 JLS  Changed handleEvent() so that it doesn't unconditionally
  25. //                      clear an event after an cmScrollBarChanged broadcast.
  26. //      08-24-92 JLS  Updated previous fix to verify that one of my scrollbars
  27. //                      is affected before calling checkScrollBar()
  28.  
  29.  
  30. #define Uses_TRect
  31. #define Uses_TKeys
  32. #define Uses_TEditor
  33. #define Uses_TIndicator
  34. #define Uses_TEvent
  35. #define Uses_TScrollBar
  36. #define Uses_TFindDialogRec
  37. #define Uses_TReplaceDialogRec
  38. #define Uses_opstream
  39. #define Uses_ipstream
  40. #include <tv.h>
  41.  
  42. #if !defined( __STRING_H )
  43. #include <string.h>
  44. #endif  // __STRING_H
  45.  
  46. #if !defined( __CTYPE_H )
  47. #include <ctype.h>
  48. #endif  // __CTYPE_H
  49.  
  50. #if !defined( __DOS_H )
  51. #include <Dos.h>
  52. #endif  // __DOS_H
  53.  
  54. inline int isWordChar( int ch )
  55. {
  56.     return isalnum(ch) || ch == '_';
  57. }
  58.  
  59. const ushort firstKeys[] =
  60. {
  61.     38,
  62.     kbCtrlA, cmWordLeft,
  63.     kbCtrlC, cmPageDown,
  64.     kbCtrlD, cmCharRight,
  65.     kbCtrlE, cmLineUp,
  66.     kbCtrlF, cmWordRight,
  67.     kbCtrlG, cmDelChar,
  68.     kbCtrlH, cmBackSpace,
  69.     kbCtrlK, 0xFF02,
  70.     kbCtrlL, cmSearchAgain,
  71.     kbCtrlM, cmNewLine,
  72.     kbCtrlO, cmIndentMode,
  73.     kbCtrlQ, 0xFF01,
  74.     kbCtrlR, cmPageUp,
  75.     kbCtrlS, cmCharLeft,
  76.     kbCtrlT, cmDelWord,
  77.     kbCtrlU, cmUndo,
  78.     kbCtrlV, cmInsMode,
  79.     kbCtrlW, cmToggleWrap,
  80.     kbCtrlX, cmLineDown,
  81.     kbCtrlY, cmDelLine,
  82.     kbLeft, cmCharLeft,
  83.     kbRight, cmCharRight,
  84.     kbCtrlLeft, cmWordLeft,
  85.     kbCtrlRight, cmWordRight,
  86.     kbHome, cmLineStart,
  87.     kbEnd, cmLineEnd,
  88.     kbUp, cmLineUp,
  89.     kbDown, cmLineDown,
  90.     kbPgUp, cmPageUp,
  91.     kbPgDn, cmPageDown,
  92.     kbCtrlPgUp, cmTextStart,
  93.     kbCtrlPgDn, cmTextEnd,
  94.     kbCtrlHome, cmWindowStart,
  95.     kbCtrlEnd, cmWindowEnd,
  96.     kbIns, cmInsMode,
  97.     kbDel, cmDelChar,
  98.     kbShiftIns, cmPaste,
  99.     kbShiftDel, cmCut,
  100.     kbCtrlIns, cmCopy,
  101.     kbCtrlDel, cmClear
  102. };
  103.  
  104. const ushort quickKeys[] =
  105. {   8,
  106.     'A', cmReplace,
  107.     'C', cmTextEnd,
  108.     'D', cmLineEnd,
  109.     'F', cmFind,
  110.     'H', cmDelStart,
  111.     'R', cmTextStart,
  112.     'S', cmLineStart,
  113.     'Y', cmDelEnd
  114. };
  115.  
  116. const ushort blockKeys[] =
  117. {   5,
  118.     'B', cmStartSelect,
  119.     'C', cmPaste,
  120.     'H', cmHideSelect,
  121.     'K', cmCopy,
  122.     'Y', cmCut
  123. };
  124.  
  125. const ushort *keyMap[] = { firstKeys, quickKeys, blockKeys };
  126.  
  127. ushort defEditorDialog( int, ... );
  128.  
  129. #pragma warn -asc
  130.  
  131. ushort scanKeyMap( const void *keyMap, int keyCode )
  132. {
  133. asm {
  134.     PUSH DS
  135.     LDS SI,keyMap
  136.     MOV DX,keyCode
  137.     CLD
  138.     LODSW
  139.     MOV CX,AX
  140.     }
  141. __1:
  142. asm {
  143.     LODSW
  144.     MOV BX,AX
  145.     LODSW
  146.     CMP BL,DL
  147.     JNE __3
  148.     OR  BH,BH
  149.     JE  __4
  150.     CMP BH,DH
  151.     JE  __4
  152.     }
  153. __3:
  154. asm {
  155.     LOOP    __1
  156.     XOR AX,AX
  157.     }
  158. __4:
  159. asm POP DS
  160.     return _AX;
  161. }
  162.  
  163. #pragma warn .asc
  164.  
  165. #define cpEditor    "\x06\x07"
  166.  
  167.  
  168. TEditor::TEditor( const TRect& bounds,
  169.                   TScrollBar *aHScrollBar,
  170.                   TScrollBar *aVScrollBar,
  171.                   TIndicator *aIndicator,
  172.                   ushort aBufSize ) :
  173.     TEditorBase( bounds ),
  174.     hScrollBar( aHScrollBar ),
  175.     vScrollBar( aVScrollBar ),
  176.     indicator( aIndicator ),
  177.     bufSize( aBufSize ),
  178.     canUndo( True ),
  179.     selecting( False ),
  180.     overwrite( False ),
  181.     autoIndent( False ),
  182.     lockCount( 0 ),
  183.     keyState( 0 ),
  184.     wordWrap( False ),
  185.     autosizeMargin( False ),
  186.     rMargin( bounds.b.x - bounds.a.x - 1),
  187.     tabSize( 4 ),
  188.     retChar(' ')
  189. {
  190.     growMode = gfGrowHiX | gfGrowHiY;
  191.     options |= ofSelectable;
  192.     eventMask = evMouseDown | evKeyDown | evCommand | evBroadcast;
  193.     showCursor();
  194.     initBuffer();
  195.     if( buffer != 0 )
  196.         isValid = True;
  197.     else
  198.         {
  199.         editorDialog( edOutOfMemory );
  200.         bufSize = 0;
  201.         isValid = False;
  202.         }
  203.     setBufLen(0);
  204. }
  205.  
  206. TEditor::~TEditor()
  207. {
  208. }
  209.  
  210. void TEditor::shutDown()
  211. {
  212.     doneBuffer();
  213.     TEditorBase::shutDown();
  214. }
  215.  
  216. void TEditor::changeBounds( const TRect& bounds )
  217. {
  218.     lock();
  219.     setBounds(bounds);
  220.     delta.x = max(0, min(delta.x, limit.x - size.x));
  221.     delta.y = max(0, min(delta.y, limit.y - size.y));
  222.  
  223.     if (autosizeMargin) {
  224.         ushort oldMargin = rMargin;
  225.         rMargin = bounds.b.x - bounds.a.x - 1;
  226.         if (wordWrap && oldMargin != rMargin) {
  227.             wordWrapBuffer(0, bufLen);
  228.         }
  229.     }
  230.  
  231.     update(ufView);
  232.  
  233.     unlock();
  234. }
  235.  
  236. // 11-11-91 JLS Added code for variable tab size
  237. int TEditor::charPos( ushort p, ushort target )
  238. {
  239.     int pos = 0;
  240.     while( p < target )
  241.         {
  242.         if( bufChar(p) == '\t' )
  243.             {
  244.             pos += (tabSize - (pos % tabSize));
  245.             }
  246.         else
  247.             pos++;
  248.  
  249.         p++;
  250.         }
  251.     return pos;
  252. }
  253.  
  254.  
  255. // 11-11-91 JLS Added code for variable tab size
  256. ushort TEditor::charPtr( ushort p, int target )
  257. {
  258.     int pos = 0;
  259.     char ch;
  260.     
  261.     while( (pos < target) && (p < bufLen) && (ch = bufChar(p)) != '\x0D' )
  262.         {
  263.         if( ch == '\t' )      // TAB
  264.             {
  265.             pos += (tabSize - (pos % tabSize));
  266.             }
  267.         else
  268.             pos++;
  269.  
  270.         p++;
  271.         }
  272.  
  273.     if( pos > target )
  274.         p--;
  275.  
  276.     return p;
  277. }
  278.  
  279. Boolean TEditor::clipCopy()
  280. {
  281.     Boolean res = False;
  282.     if( (clipboard != 0) && (clipboard != this) )
  283.         {
  284.         res = clipboard->insertFrom(this);
  285.         selecting = False;
  286.         update(ufUpdate);
  287.         }
  288.     return res;
  289. }
  290.  
  291. void TEditor::clipCut()
  292. {
  293.     if( clipCopy() == True )
  294.         deleteSelect();
  295. }
  296.  
  297. void TEditor::clipPaste()
  298. {
  299.     if( (clipboard != 0) && (clipboard != this) )
  300.         insertFrom(clipboard);
  301. }
  302.  
  303. void TEditor::convertEvent( TEvent& event )
  304. {
  305.     if( event.what == evKeyDown )
  306.         {
  307.         if( (event.shiftState & (kbRightShift | kbLeftShift)) != 0 &&
  308.             event.keyDown.charScan.scanCode >= 0x47 &&
  309.             event.keyDown.charScan.scanCode <= 0x51
  310.           )
  311.             event.keyDown.charScan.charCode = 0;
  312.  
  313.         ushort key = event.keyDown.keyCode;
  314.         if( keyState != 0 )
  315.             {
  316.             if( (key & 0xFF) >= 0x01 && (key & 0xFF) <= 0x1A )
  317.                 key += 0x40;
  318.             if( (key & 0xFF) >= 0x61 && (key & 0xFF) <= 0x7A )
  319.                 key -= 0x20;
  320.             }
  321.         key = scanKeyMap(keyMap[keyState], key);
  322.         keyState = 0;
  323.         if( key != 0 )
  324.             if( (key & 0xFF00) == 0xFF00 )
  325.                 {
  326.                 keyState = (key & 0xFF);
  327.                 clearEvent(event);
  328.                 }
  329.             else
  330.                 {
  331.                 event.what = evCommand;
  332.                 event.message.command = key;
  333.                 }
  334.         }
  335. }
  336.  
  337. Boolean TEditor::cursorVisible()
  338. {
  339.   return Boolean((curPos.y >= delta.y) && (curPos.y < delta.y + size.y));
  340. }
  341.